/**
  ******************************************************************************
  * @file    message_queue.h
  * @author  ashuai0110
  * @version V2.4
  * @date    2024-09-10
  * @brief   消息队列
  *          (适合不定长数据和复杂数据,写入时动态申请内存)
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __MESSAGE_QUEUE_H
#define __MESSAGE_QUEUE_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup modules
 * @{
 */

/**
 * @addtogroup message_queue
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup message_queue_global_types message_queue global types
 * @{
 */

/** 
  * @brief  消息项 structrue definition
  */
typedef struct mes_queue_item {
    uint32_t size;                /*!< 数据数量 */
    struct mes_queue_item *pNext; /*!< 链表节点 */
    char data[];                  /*!< 数据,采用柔性数组概念 */
} mes_queue_item_t;

/** 
  * @brief  消息队列 structrue definition
  */
typedef struct mes_queue {
    uint32_t maxCnt;         /*!< 消息数量 非消息长度而是消息项结构体(mes_queue_item_t)的个数 */
    uint32_t curCnt;         /*!< 当前消息数量 */
    mes_queue_item_t *pHead; /*!< 消息队列头节点 */
} mes_queue_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup message_queue_global_functions
 * @{
 */

void mes_queue_init(mes_queue_t *_mq, uint32_t size);
void mes_queue_de_init(mes_queue_t *_mq);

uint8_t mes_queue_write(mes_queue_t *_mq, void *pData, uint32_t size);
uint8_t mes_queue_read(mes_queue_t *_mq, void *pBuf, uint32_t *size);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* message_queue.h */
